package com.yupi.springbootinit.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yupi.springbootinit.controller.WorkflowTaskController;
import com.yupi.springbootinit.model.entity.User;
import com.yupi.springbootinit.model.entity.WorkflowTask;
import com.yupi.springbootinit.model.vo.DepartmentTaskStatsVO;
import com.yupi.springbootinit.model.vo.PersonalTaskStatsVO;
import com.yupi.springbootinit.model.vo.WorkflowTaskVO;

import java.util.List;

public interface WorkflowTaskService {

    /**
     * 为销售订单创建工程部待办：创建工艺单
     */
    void createProcessSheetTaskForSalesOrder(Long salesOrderId, String orderNumber, String productName, Long creatorId, String creatorName);

    /**
     * 为销售订单创建PMC待办：生产排期
     */
    void createScheduleTaskForSalesOrder(Long salesOrderId, String orderNumber, String productName, Long creatorId, String creatorName);

    /**
     * 清机完成后为版次创建生产工单任务（不拆分工序）
     */
    void createProductionWorkorderTaskForBatch(Long batchId, String orderNumber, String productName, Long creatorId, String creatorName);

    /**
     * 完成工程部待办：创建工艺单完成（幂等，含并发条件）
     * @return true=成功从PENDING改为DONE；false=未命中（可能已处理或未创建）
     */
    boolean completeProcessSheetTaskForSalesOrder(Long salesOrderId, Long completedBy, String completedByName);

    /**
     * 按部门查询待办分页（可选状态筛选）
     */
    Page<WorkflowTask> pageDepartmentTasks(Long departmentId, String status, long current, long size);

    /**
     * 按部门查询待办分页（返回VO对象）
     */
    Page<WorkflowTaskVO> pageDepartmentTasksVO(Long departmentId, String status, long current, long size, User currentUser);

    /**
     * 查询我的待办任务（已认领的任务）
     */
    Page<WorkflowTaskVO> pageMyTasks(Long userId, String status, long current, long size, User currentUser);

    /**
     * 认领待办（并发防护）
     * 仅当任务属于该部门，状态为PENDING且未被认领时，才可认领成功并置为IN_PROGRESS
     * @return true=认领成功；false=已被他人认领或状态不允许
     */
    boolean claimTask(Long taskId, Long userId, String userName, Long departmentId);

    /**
     * 完成待办任务
     * @return true=完成成功；false=完成失败
     */
    boolean startTask(Long taskId, Long operatorId, String operatorName, Long recorderUserId, String recorderUserName, String remark);

    boolean completeTask(Long taskId, Long operatorId, String operatorName, Long recorderUserId, String recorderUserName, String remark);

    // 兼容旧方法（保留）
    boolean completeTask(Long taskId, Long userId, String userName, String remark);

    /**
     * 获取任务统计信息（历史接口）
     */
    WorkflowTaskController.TaskStatistics getTaskStatistics(Long departmentId, Long userId);

    /**
     * 部门任务统计（用于首页看板）
     */
    DepartmentTaskStatsVO getDepartmentTaskStats(Long departmentId);

    /**
     * 个人任务统计（用于个人任务中心）
     * 
     * @param userId 用户ID
     * @return 个人任务统计信息
     */
    PersonalTaskStatsVO getPersonalTaskStats(Long userId);

    /**
     * 查询父任务下的所有子任务
     * 主要用于：PMC排期任务展开查看批次发布子任务
     * 
     * @param parentTaskId 父任务ID
     * @param currentUser 当前用户
     * @return 子任务列表
     */
    List<WorkflowTaskVO> listSubTasks(Long parentTaskId, User currentUser);

    /**
     * 查询用户已认领的创建工艺单任务（用于工艺单管理页面）
     */
    Page<WorkflowTaskVO> pageMyProcessSheetTasks(Long userId, String status, long current, long size, User currentUser);

    /**
     * 查询创建工艺单任务（支持管理员查看所有任务）
     * @param userId 用户ID，管理员传null可查看所有任务
     * @param isAdmin 是否为管理员
     * @param status 任务状态过滤
     * @param current 当前页
     * @param size 页面大小
     * @param currentUser 当前用户
     * @return 任务分页列表
     */
    Page<WorkflowTaskVO> pageProcessSheetTasks(Long userId, boolean isAdmin, String status, long current, long size, User currentUser);

    /**
     * 为单个版次创建PMC发布待办（PUBLISH_BATCH）
     * 
     * @param batchId 版次ID
     * @param orderNumber 订单号
     * @param batchCode 版次编码
     * @param parentTaskId 父任务ID（PMC排期任务ID）
     * @param creatorId 创建人ID
     * @param creatorName 创建人姓名
     */
    void createPublishBatchTaskForBatch(Long batchId, String orderNumber, String batchCode, 
                                        Long parentTaskId, Long creatorId, String creatorName);

    /**
     * 完成PMC发布版次待办（根据batchId）
     * @return true=成功；false=未命中
     */
    boolean completePublishBatchTaskForBatch(Long batchId, Long completedBy, String completedByName, String remark);

    /**
     * 完成PMC排期待办（订单维度，全部版次发布后调用）
     * @return true=成功；false=未命中
     */
    boolean completeScheduleTaskForSalesOrder(Long salesOrderId, Long completedBy, String completedByName, String remark);

    /**
     * 完成PMC排期待办（RDO订单维度，全部版次发布后调用）
     * @return true=成功；false=未命中
     */
    boolean completeScheduleTaskForRdoOrder(Long rdoOrderId, Long completedBy, String completedByName, String remark);

    /**
     * 检查用户是否可以认领任务
     *
     * @param taskId 任务ID
     * @param user 当前用户
     * @return true=可以认领，false=不可以
     */
    boolean checkCanClaim(Long taskId, User user);

    /**
     * 检查用户是否可以处理任务
     *
     * @param taskId 任务ID
     * @param user 当前用户
     * @return true=可以处理，false=不可以
     */
    boolean checkCanProcess(Long taskId, User user);

    /**
     * 检查用户是否可以查看任务附件
     *
     * @param taskId 任务ID
     * @param user 当前用户
     * @return true=可以查看，false=不可以
     */
    boolean checkCanViewAttachment(Long taskId, User user);

    /**
     * 检查用户是否可以完成任务
     *
     * @param taskId 任务ID
     * @param user 当前用户
     * @return true=可以完成，false=不可以
     */
    boolean checkCanComplete(Long taskId, User user);

    /**
     * 为任务VO计算并填充权限信息
     *
     * @param taskVO 任务VO对象
     * @param currentUser 当前用户
     */
    void calculateTaskPermissions(WorkflowTaskVO taskVO, User currentUser);

    /**
     * 获取当前用户已认领的创建工艺单任务
     */
    List<WorkflowTask> getMyClaimedProcessSheetTasks(Long userId);
}